package com.zzuli.yxy.task;

import com.zzuli.yxy.entity.Album;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.zzuli.yxy.service.AlbumService;
import com.zzuli.yxy.task.springDataPipeline.AlbumPipeline;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.BloomFilterDuplicateRemover;
import us.codecraft.webmagic.scheduler.QueueScheduler;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 目标地址：https://music.163.com/album?id=2263157
 * 获取 专辑图片 发行时间 发行公司 简介信息
 * @auther pony
 * @create 2023-04-05 15:01
 */
@Component
public class AlbumTask implements PageProcessor {

    @Autowired
    private AlbumService albumService;

    private String basicUrl = "https://music.163.com/album?id=";

    @Override
    public void process(Page page) {
        // 用于封装 专辑 id、 图片、发行公司 发行
        Album album = new Album();
        //1、根据路径，获取专辑id
        String url = page.getUrl().toString();
        System.out.println("url:"+url);
        //截取获得 albumId
        String albumId = url.substring(url.lastIndexOf("=") + 1);
        System.out.println("albumId:"+albumId);

        //2、获取专辑图片地址
        // 转化为string <img src="http://p2.music.126.net/lHab-TuxFpGuCCv661i7eg==/109951163095170102.jpg?param=177y177" class="j-img" data-src="http://p2.music.126.net/lHab-TuxFpGuCCv661i7eg==/109951163095170102.jpg">
        String albumImg = page.getHtml().css("div.cover img.j-img").toString();
        System.out.println("albumImg:" + albumImg);
        //截取获得地址
        // http://p2.music.126.net/lHab-TuxFpGuCCv661i7eg==/109951163095170102.jpg?param=177y177
        String albumImgUrl = albumImg.substring(albumImg.indexOf("src=\"") + 5, albumImg.indexOf("class")-2);
        System.out.println("albumImgUrl:" + albumImgUrl);

        //3、获得专辑发行时间 和 发行公司
        List<String> pList = page.getHtml().css("div.topblk p.intr","text").all();
        // 一共三个 p，分别是 歌手，发行时间，发行公司
        System.out.println("pList" + pList);
        // 发行时间
        String albumReleaseTime = pList.get(1);
        System.out.println("albumReleaseTime:" + albumReleaseTime);
        //发行公司不一定有，要先判断一下
        if (pList.size()==3){
            // 发行公司
            String albumCompanyString = pList.get(2);
            // 截取去掉前后空格
            String albumCompany = albumCompanyString.substring(1, albumCompanyString.length() - 1);
            System.out.println("albumCompany:" + albumCompany);
            album.setAlbumCompany(albumCompany);
        }

        //4、获取专辑简介
        List<String> remarksPList = page.getHtml().css("div#album-desc-more p.f-brk","text").all();

        System.out.println("remarksPList"+remarksPList);
        //使用 ort org.apache.commons.lang3.StringUtils; 包的一个工具类将list 转 string，并用 \n 分隔开
        String albumRemarks = StringUtils.join(remarksPList, "\\n") + "\\n";
        System.out.println("albumRemarks:"+albumRemarks);

        //5、封装数据
        album.setAlbumId(Integer.valueOf(albumId));
        album.setAlbumImg(albumImgUrl);
        // 时间 string -> date
        // 时间格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        // 解析
        try {
            Date date = simpleDateFormat.parse(albumReleaseTime);
            album.setAlbumReleaseTime(date);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        album.setAlbumRemarks(albumRemarks);

        //6、保存数据给 Pipeline 进行数据库保存
        page.putField("album", album);
    }

    private Site site = Site.me();
    @Override
    public Site getSite(){
        return site;
    }

    @Autowired
    private AlbumPipeline albumPipeline;
//    @Scheduled(initialDelay = 1 * 1000, fixedRate=1000*60*60*24*7)
    public void process(){
        //1、查询数据库，获取所有歌手
        List<Album> albumList = albumService.list();
        //2、遍历 songList，得到每个歌手的 id
        for (Album album : albumList) {
            // 3、通过id，拼接要爬虫地址
            Integer albumId = album.getAlbumId();
            String url = basicUrl + albumId;
            // 4、配置请求信息
            Request request = new Request(url);
            // 请求方法
            request.setMethod("GET");
            // 浏览器基本信息，用于反爬
            request.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36");

            Spider.create(new AlbumTask())
                    .addRequest(request)
                    // 使用布隆过滤器进行去重， 10000 大概要放的数据，数据越大越慢
                    // 使用前先引一个新版本的依赖
                    .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000)))
                    .thread(10)
                    .addPipeline(this.albumPipeline)
                    .run();
        }
    }
}
